From f6944502399bea6e833e3a855b76b1f2c4368ab8 Mon Sep 17 00:00:00 2001 From: Alex Williamson Date: Thu, 5 Apr 2007 09:18:49 -0600 Subject: [PATCH] [IA64] Fix xm dump-core with vti domain Share privregs with domain and assign it to pseudo physical address space as para virtualized domain. Signed-off-by: Isaku Yamahata --- tools/libxc/xc_core_ia64.c | 1 + xen/arch/ia64/vmx/vmx_init.c | 1 + xen/arch/ia64/xen/domain.c | 34 +++++++++++++++++++++------------- xen/include/asm-ia64/domain.h | 1 + 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/tools/libxc/xc_core_ia64.c b/tools/libxc/xc_core_ia64.c index dff561b3d4..27874dc985 100644 --- a/tools/libxc/xc_core_ia64.c +++ b/tools/libxc/xc_core_ia64.c @@ -93,6 +93,7 @@ memory_map_get_old_hvm(int xc_handle, xc_dominfo_t *info, {IO_PAGE_START, IO_PAGE_SIZE}, {STORE_PAGE_START, STORE_PAGE_SIZE}, {BUFFER_IO_PAGE_START, BUFFER_IO_PAGE_SIZE}, + {BUFFER_PIO_PAGE_START, BUFFER_PIO_PAGE_SIZE}, {GFW_START, GFW_SIZE}, }; const unsigned int nr_gfw_map = sizeof(gfw_map)/sizeof(gfw_map[0]); diff --git a/xen/arch/ia64/vmx/vmx_init.c b/xen/arch/ia64/vmx/vmx_init.c index 65c62f6454..01c0e4a8a4 100644 --- a/xen/arch/ia64/vmx/vmx_init.c +++ b/xen/arch/ia64/vmx/vmx_init.c @@ -301,6 +301,7 @@ vmx_final_setup_guest(struct vcpu *v) ASSERT(vpd); v->arch.privregs = (mapped_regs_t *)vpd; + vcpu_share_privregs_with_guest(v); vpd->vpd_low.virt_env_vaddr = vm_buffer; /* Per-domain vTLB and vhpt implementation. Now vmx domain will stick diff --git a/xen/arch/ia64/xen/domain.c b/xen/arch/ia64/xen/domain.c index cbb5a2800b..7804765315 100644 --- a/xen/arch/ia64/xen/domain.c +++ b/xen/arch/ia64/xen/domain.c @@ -446,22 +446,11 @@ int vcpu_initialise(struct vcpu *v) return 0; } -int vcpu_late_initialise(struct vcpu *v) +void vcpu_share_privregs_with_guest(struct vcpu *v) { struct domain *d = v->domain; - int rc, order, i; - - if (HAS_PERVCPU_VHPT(d)) { - rc = pervcpu_vhpt_alloc(v); - if (rc != 0) - return rc; - } + int i, order = get_order_from_shift(XMAPPEDREGS_SHIFT); - /* Create privregs page. */ - order = get_order_from_shift(XMAPPEDREGS_SHIFT); - v->arch.privregs = alloc_xenheap_pages(order); - BUG_ON(v->arch.privregs == NULL); - memset(v->arch.privregs, 0, 1 << XMAPPEDREGS_SHIFT); for (i = 0; i < (1 << order); i++) share_xen_page_with_guest(virt_to_page(v->arch.privregs) + i, d, XENSHARE_writable); @@ -474,6 +463,25 @@ int vcpu_late_initialise(struct vcpu *v) for (i = 0; i < XMAPPEDREGS_SIZE; i += PAGE_SIZE) assign_domain_page(d, IA64_XMAPPEDREGS_PADDR(v->vcpu_id) + i, virt_to_maddr(v->arch.privregs + i)); +} + +int vcpu_late_initialise(struct vcpu *v) +{ + struct domain *d = v->domain; + int rc, order; + + if (HAS_PERVCPU_VHPT(d)) { + rc = pervcpu_vhpt_alloc(v); + if (rc != 0) + return rc; + } + + /* Create privregs page. */ + order = get_order_from_shift(XMAPPEDREGS_SHIFT); + v->arch.privregs = alloc_xenheap_pages(order); + BUG_ON(v->arch.privregs == NULL); + memset(v->arch.privregs, 0, 1 << XMAPPEDREGS_SHIFT); + vcpu_share_privregs_with_guest(v); return 0; } diff --git a/xen/include/asm-ia64/domain.h b/xen/include/asm-ia64/domain.h index d15265d7d9..80af70cde5 100644 --- a/xen/include/asm-ia64/domain.h +++ b/xen/include/asm-ia64/domain.h @@ -21,6 +21,7 @@ struct tlb_track; extern void domain_relinquish_resources(struct domain *); struct vcpu; extern void relinquish_vcpu_resources(struct vcpu *v); +extern void vcpu_share_privregs_with_guest(struct vcpu *v); extern int vcpu_late_initialise(struct vcpu *v); /* given a current domain metaphysical address, return the physical address */ -- 2.30.2